/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.unicon.autoservicio.controller;

/**
 *
 * @author JMENDOZA | 20140220 | Proy. 817: Se crea Servlet genera previo de reporte en PDF 
 */
 
import com.unicon.autoservicio.dao.PedidoDAO;
import com.unicon.autoservicio.util.Util;
import com.unicon.sdc.ds.ws.DespachosCSBean;
import com.unicon.sdc.ds.ws.PedidoBean;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.dom.DOMSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;


public final class ServletReportes extends HttpServlet{
    
    public static final long serialVersionUID = 1;
    private SimpleDateFormat sdfHora = new SimpleDateFormat("HH:mm");
    private SimpleDateFormat sdfFecha = new SimpleDateFormat("dd/MM/yyyy");
    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, ParseException, DatatypeConfigurationException, JRException {   
        /*String opcion = request.getParameter("opcion");
         * String tipo = request.getParameter("tipo");
         * 
         * String codUsu = "";
         * String codCli = "";
         * String codObra = "";
         * String feIni;
         * String feFin;
         * String Reporte = "";
         * Element estructuraXML = null;
         * Map params = new HashMap();
         * String pathImagenes = "./images/";
         * 
         * 
         * if(tipo!=null){
         * 
         * switch (opcion){
         * case "pedidosemana":
         * codUsu = request.getParameter("usu");
         * codCli = request.getParameter("cli");
         * feIni = request.getParameter("feini");
         * feFin = request.getParameter("fefin");
         * codObra = request.getParameter("obr");
         * 
         * Reporte = "reportes/reProgamacionSemana.jasper";
         * params.put("prm_img_titulo", request.getSession().getServletContext().getRealPath("images/Titulo_A4_Horizontal.gif"));
         * params.put("prm_img_pie", request.getSession().getServletContext().getRealPath("images/PIE-DE-PAGINA-HORIZONTAL.gif"));
         * params.put("prm_FechaDesde", feIni);
         * params.put("prm_FechaHasta", feFin);
         * //docum = getEstructuraXMLPedidosSemana(codUsu, codCli, sdfFecha.parse(feIni), sdfFecha.parse(feFin), codObra);
         * 
         * estructuraXML = getEstructuraXMLPedidosSemana(codUsu, codCli, sdfFecha.parse(feIni), sdfFecha.parse(feFin), codObra);
         * break;
         * 
         * case "reportehistorico":
         * codUsu = request.getParameter("usu");
         * codCli = request.getParameter("cli");
         * feIni = request.getParameter("feini");
         * feFin = request.getParameter("fefin");
         * codObra = request.getParameter("obr");
         * String codOrd = request.getParameter("ord");
         * 
         * Reporte = "reportes/reHistoricoDespachos.jasper";
         * params.put("prm_img_titulo", request.getSession().getServletContext().getRealPath("images/Titulo_A4_Horizontal.gif"));
         * params.put("prm_img_pie", request.getSession().getServletContext().getRealPath("images/PIE-DE-PAGINA-HORIZONTAL.gif"));
         * params.put("prm_FechaDesde", feIni);
         * params.put("prm_FechaHasta", feFin);
         * estructuraXML = getEstructuraXMLReporteHistorico(codUsu, codCli, sdfFecha.parse(feIni), sdfFecha.parse(feFin), codObra, codOrd);
         * break;
         * 
         * }
         * if(estructuraXML == null)
         * {
         * return;
         * }
         * 
         * try{
         * 
         * params.put(JRXPathQueryExecuterFactory.PARAMETER_XML_DATA_DOCUMENT, estructuraXML.getOwnerDocument());
         * params.put(JRXPathQueryExecuterFactory.XML_DATE_PATTERN, "yyyy-MM-dd");
         * params.put(JRXPathQueryExecuterFactory.XML_NUMBER_PATTERN, "#,##0.##");
         * params.put(JRXPathQueryExecuterFactory.XML_LOCALE, Locale.ENGLISH);
         * params.put(JRParameter.REPORT_LOCALE, Locale.US);
         * 
         * //JRXmlDataSource xmlDataSource = new JRXmlDataSource(docum, "/pedidos/pedido");
         * 
         * File reportFile = new File(request.getSession().getServletContext().getRealPath(Reporte));
         * 
         * byte[] bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), params);
         * 
         * response.setContentType("application/pdf");
         * response.setContentLength(bytes.length);
         * ServletOutputStream ouputStream = response.getOutputStream();
         * ouputStream.write(bytes, 0, bytes.length);
         * ouputStream.flush();
         * ouputStream.close();
         * }catch (JRException | IOException ex){
         * ex.printStackTrace();
         * }
         * 
         * 
         * }*/
    }
    
    //<editor-fold defaultstate="collapsed" desc="Metodos">
    private Element getEstructuraXMLPedidosSemana(String usuario, String cliente, Date fechaInicial, Date fechaFinal, String obra) throws DatatypeConfigurationException
    {
        
        XMLGregorianCalendar fecIni;
        XMLGregorianCalendar fecFin;
        
        fecIni = Util.dateToXMLGregorian(fechaInicial);
        fecFin = Util.dateToXMLGregorian(fechaFinal);
        
        PedidoDAO pedidoDao = new PedidoDAO();
        ArrayList<PedidoBean> pedidos = (ArrayList<PedidoBean>) pedidoDao.getPedidosCS(usuario, cliente,
                fecIni,
                fecFin,
                obra,
                "0",
                "1",
                "",
                "");
        
        Document dom = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //get an instance of builder
            DocumentBuilder db = dbf.newDocumentBuilder();
            
            //create an instance of DOM
            dom = db.newDocument();
            
        } catch (ParserConfigurationException pce) {
            //dump it
            
        }
        
        Element reportePedidos = dom.createElement("pedidos");
        dom.appendChild(reportePedidos);
        
        for (PedidoBean pedido : pedidos)  {
            
            Element pedidoElement = dom.createElement("pedido");
            
            Element fechaPedido = dom.createElement("fecha");
            Text fechaPedidoText = dom.createTextNode(sdfFecha.format( pedido.getOrderDate().toGregorianCalendar().getTime()));
            fechaPedido.appendChild(fechaPedidoText);
            
            Element descripcionObra = dom.createElement("obra");
            Text descripcionObraText = dom.createTextNode(pedido.getDescObr());
            descripcionObra.appendChild(descripcionObraText);
            
            Element orderCode = dom.createElement("orderCode");
            Text orderCodeText = dom.createTextNode(pedido.getOrderCode().trim());
            orderCode.appendChild(orderCodeText);
            
            Element tipoPedido = dom.createElement("tipo");
            Text tipoPedidoText = dom.createTextNode(pedido.getDeTiPed().trim());
            tipoPedido.appendChild(tipoPedidoText);
            
            Element disenio = dom.createElement("disenio");
            Text disenioText = dom.createTextNode(pedido.getShortescr().trim());
            disenio.appendChild(disenioText);
            
            Element volumenM3 = dom.createElement("volumen");
            Text volumenM3Text = dom.createTextNode(String.format("%1$,.2f", pedido.getOrderQty()));
            volumenM3.appendChild(volumenM3Text);
            
            Element estadoPedido = dom.createElement("estado");
            Text estadoPedidoText = dom.createTextNode(pedido.getDeEsOrdr().trim());
            estadoPedido.appendChild(estadoPedidoText);
            
            Element orderHour = dom.createElement("hora");
            Text orderHourText = dom.createTextNode(sdfHora.format( pedido.getStartTime().toGregorianCalendar().getTime()));
            orderHour.appendChild(orderHourText);
            
            pedidoElement.appendChild(fechaPedido);
            pedidoElement.appendChild(descripcionObra);
            pedidoElement.appendChild(orderCode);
            pedidoElement.appendChild(tipoPedido);
            pedidoElement.appendChild(disenio);
            pedidoElement.appendChild(volumenM3);
            pedidoElement.appendChild(estadoPedido);
            pedidoElement.appendChild(orderHour);
            
            reportePedidos.appendChild(pedidoElement);
        }
        
        DOMSource ds = new DOMSource();
        ds.setNode(reportePedidos.getParentNode());
        
        return reportePedidos;
        //return dom;
    }
    
    /*private Element getEstructuraXMLReporteHistorico(String usuario, String cliente, Date fechaInicial, Date fechaFinal, String obra, String Pedido) throws DatatypeConfigurationException    {
     * 
     * XMLGregorianCalendar fecIni;
     * XMLGregorianCalendar fecFin;
     * String cadena = "";
     * 
     * fecIni = Util.dateToXMLGregorian(fechaInicial);
     * fecFin = Util.dateToXMLGregorian(fechaFinal);
     * 
     * PedidoDAO pedidoDao = new PedidoDAO();
     * ArrayList<DespachosCSBean> despachos = (ArrayList<DespachosCSBean>) pedidoDao.getDespachosCS(
     * usuario,
     * cliente,
     * fecIni,
     * fecFin,
     * obra,
     * Pedido,
     * "",
     * "");
     * 
     * Document dom = null;
     * DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
     * try {
     * //get an instance of builder
     * DocumentBuilder db = dbf.newDocumentBuilder();
     * 
     * //create an instance of DOM
     * dom = db.newDocument();
     * 
     * } catch (ParserConfigurationException pce) {
     * //dump it
     * 
     * }
     * 
     * Element reportePedidos = dom.createElement("despachos");
     * dom.appendChild(reportePedidos);
     * 
     * 
     * 
     * for (DespachosCSBean despacho : despachos)  {
     * 
     * Element pedidoElement = dom.createElement("despacho");
     * 
     * Element iniciovaciado = dom.createElement("iniciovaciado");
     * cadena = (despacho.getBeginUnldTime() == null ? "" : sdfHora.format( despacho.getBeginUnldTime().toGregorianCalendar().getTime()));
     * Text iniciovaciadoText = dom.createTextNode(cadena);
     * iniciovaciado.appendChild(iniciovaciadoText);
     * 
     * Locale locale1 = new Locale("es", "PE");
     * Element cantidad = dom.createElement("cantidad");
     * cadena = (despacho.getDelvQty() == null ? "" : String.format(locale1, "%1$,.2f", despacho.getDelvQty()));
     * Text cantidadText = dom.createTextNode(cadena);
     * cantidad.appendChild(cantidadText);
     * 
     * Element finvaciado = dom.createElement("finvaciado");
     * cadena = (despacho.getEndUnldTime() == null ? "" : sdfHora.format( despacho.getEndUnldTime().toGregorianCalendar().getTime()));
     * Text finvaciadoText = dom.createTextNode(cadena);
     * finvaciado.appendChild(finvaciadoText);
     * 
     * Element llegadaobra = dom.createElement("llegadaobra");
     * cadena = (despacho.getOnJobTime() == null ? "" : sdfHora.format( despacho.getOnJobTime().toGregorianCalendar().getTime()));
     * Text llegadaobraText = dom.createTextNode(cadena);
     * llegadaobra.appendChild(llegadaobraText);
     * 
     * Element nropedido = dom.createElement("nropedido");
     * cadena = (despacho.getOrderCode() == null ? "" : despacho.getOrderCode().trim());
     * Text nropedidoText = dom.createTextNode(cadena);
     * nropedido.appendChild(nropedidoText);
     * 
     * Element fechapedido = dom.createElement("fechapedido");
     * cadena = (despacho.getOrderDate() == null ? "" : sdfFecha.format( despacho.getOrderDate().toGregorianCalendar().getTime()));
     * Text fechapedidoText = dom.createTextNode(cadena);
     * fechapedido.appendChild(fechapedidoText);
     * 
     * Element planta = dom.createElement("planta");
     * cadena = (despacho.getPlantName() == null ? "" : despacho.getPlantName().trim());
     * Text plantaText = dom.createTextNode(cadena);
     * planta.appendChild(plantaText);
     * 
     * Element nroprogramacion = dom.createElement("nroprogramacion");
     * cadena = (despacho.getSchlNum() == null ? "" : despacho.getSchlNum().trim());
     * Text nroprogramacionText = dom.createTextNode(cadena);
     * nroprogramacion.appendChild(nroprogramacionText);
     * 
     * Element producto = dom.createElement("producto");
     * cadena = (despacho.getShortProdDescr() == null ? "" : despacho.getShortProdDescr().trim());
     * Text productoText = dom.createTextNode(cadena);
     * producto.appendChild(productoText);
     * 
     * Element teo = dom.createElement("teo");
     * cadena = (despacho.getTeo() == null ? "" : String.format("%1$,.0f", despacho.getTeo()));
     * Text teoText = dom.createTextNode(cadena);
     * teo.appendChild(teoText);
     * 
     * Element salidaaobra = dom.createElement("salidaaobra");
     * cadena = (despacho.getToJobTime() == null ? "" : sdfHora.format( despacho.getToJobTime().toGregorianCalendar().getTime()));
     * Text salidaaobraText = dom.createTextNode(cadena);
     * salidaaobra.appendChild(salidaaobraText);
     * 
     * Element camion = dom.createElement("camion");
     * cadena = (despacho.getTruckCode() == null ? "" : despacho.getTruckCode().trim());
     * Text camionText = dom.createTextNode(cadena);
     * camion.appendChild(camionText);
     * 
     * Element elemento = dom.createElement("elemento");
     * cadena = (despacho.getUsageDescr() == null ? "" : despacho.getUsageDescr().trim());
     * Text elementoText = dom.createTextNode(cadena);
     * elemento.appendChild(elementoText);
     * 
     * pedidoElement.appendChild(iniciovaciado);
     * pedidoElement.appendChild(cantidad);
     * pedidoElement.appendChild(finvaciado);
     * pedidoElement.appendChild(llegadaobra);
     * pedidoElement.appendChild(nropedido);
     * pedidoElement.appendChild(fechapedido);
     * pedidoElement.appendChild(planta);
     * pedidoElement.appendChild(nroprogramacion);
     * pedidoElement.appendChild(producto);
     * pedidoElement.appendChild(teo);
     * pedidoElement.appendChild(salidaaobra);
     * pedidoElement.appendChild(camion);
     * pedidoElement.appendChild(elemento);
     * 
     * reportePedidos.appendChild(pedidoElement);
     * }
     * 
     * DOMSource ds = new DOMSource();
     * ds.setNode(reportePedidos.getParentNode());
     * 
     * return reportePedidos;
     * //return dom;
     * }*/
    
    //</editor-fold>
    

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (ParseException | DatatypeConfigurationException | JRException ex) {
            Logger.getLogger(ServletReportes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (ParseException | DatatypeConfigurationException | JRException ex) {
            Logger.getLogger(ServletReportes.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    
    
}
